/*****************************************************************************
 * Copyright (c) 2010 CEA LIST.
 *
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *  Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.papyrus.uml.diagram.common.ui.dialogs;

import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.papyrus.uml.diagram.common.Activator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * This class provides a text area, with a validator to edit a text
 */
public class InputDialogMessage extends InputDialog {

	/** the warning icon */
	private static final String ICON_WARNING = "/icons/warning.gif"; //$NON-NLS-1$

	/** Input text widget. */

	private Text text;

	/** Error message label widget. */
	private CLabel warningMessageText;

	/** Error message string. */

	private String warningMessage;

	/** Input Validator, can be null */
	private final IInputValidator validator;

	/**
	 * Constructor.
	 *
	 * @param parentShell
	 */
	protected InputDialogMessage(Shell parentShell, String dialogTitle, String errorMessage, String initialValue, IInputValidator validator) {
		super(parentShell, dialogTitle, errorMessage, initialValue);
		this.validator = validator;
	}

	/**
	 *
	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
	 *
	 */
	@Override
	protected void okPressed() {
		setValue(text.getText());
		super.okPressed();
	}

	/**
	 *
	 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
	 *
	 * @param parent
	 */
	@Override
	protected void createButtonsForButtonBar(Composite parent) {
		super.createButtonsForButtonBar(parent);
		text.setFocus();
		if (getValue() != null) {
			text.setText(getValue());
			text.selectAll();
		}
	}

	/**
	 *
	 * @see org.eclipse.papyrus.uml.diagram.common.ui.dialogs.InputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
	 *
	 * @param parent
	 * @return
	 */
	@Override
	protected Control createDialogArea(Composite parent) {
		// create composite
		Composite composite = (Composite) super.createDialogArea(parent);

		text = new Text(composite, getInputTextStyle());
		text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
		text.addModifyListener(new ModifyListener() {

			@Override
			public void modifyText(ModifyEvent e) {
				validateInput();
			}
		});
		warningMessageText = new CLabel(composite, SWT.READ_ONLY | SWT.WRAP);
		warningMessageText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
		warningMessageText.setBackground(warningMessageText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		// Set the error message text
		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=66292
		setWarningMessage(warningMessage);

		applyDialogFont(composite);
		return composite;
	}

	/**
	 * Returns the text area.
	 *
	 * @return the text area
	 */
	protected Text getText() {
		return text;
	}

	/**
	 * Returns the validator.
	 *
	 * @return the validator
	 */
	protected IInputValidator getValidator() {
		return validator;
	}

	/**
	 * Validates the input.
	 * <p>
	 * The default implementation of this framework method delegates the request to the supplied input validator object; if it finds the input invalid, the error message is displayed in the dialog's message line. This hook method is called whenever the text
	 * changes in the input field.
	 * </p>
	 */
	protected void validateInput() {
		String errorMessage = null;
		if (validator != null) {
			errorMessage = validator.isValid(text.getText());
		}
		// Bug 16256: important not to treat "" (blank error) the same as null
		// (no error)
		setWarningMessage(errorMessage);
	}

	/**
	 * Set the warning message
	 *
	 * @param errorMessage
	 */
	public void setWarningMessage(String errorMessage) {
		this.warningMessage = errorMessage;
		if ((warningMessageText != null) && !warningMessageText.isDisposed()) {
			Image errorImage = Activator.getPluginIconImage(Activator.ID, ICON_WARNING);
			warningMessageText.setImage(errorMessage == null ? null : errorImage);
			warningMessageText.setText(errorMessage == null ? "" : errorMessage); //$NON-NLS-1$
			warningMessageText.getParent().update();
			// Access the ok button by id, in case clients have overridden
			// button creation.
			// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=113643

			// Control button = getButton(IDialogConstants.OK_ID);
			// if(button != null) {
			// button.setEnabled(errorMessage == null);
			// }
		}
	}

	/**
	 * Returns the style bits that should be used for the input text field.
	 * Defaults to a single line entry. Subclasses may override.
	 *
	 * @return the integer style bits that should be used when creating the
	 *         input text
	 *
	 * @since 3.4
	 */
	protected int getInputTextStyle() {
		return SWT.SINGLE | SWT.BORDER;
	}

}
